#ifndef _LOG_HPP_
#define _LOG_HPP_

/* 日志输出文件设计 */

#include <iostream>
#include <string>
#include <cstdarg>      // 可变参数等相关头文件
#include <cstdio>
#include <ctime>
/**
 * 注意：日志是有日志级别的！不同的级别代表不同的响应机制！
 * 注意：日志输出的基本内容：
 *  1. 日志等级
 *  2. 日志时间
 *  3. 日志内容
 *  4. 其他（代码函数：错误位置等；支持用户自定义！文件行、文件名 ...）
*/
#define DEBUG   0         // 实际中没有这个等级
#define NORMAL  1         // 正常
#define WARNING 2         // 警告：有问题，没出错，不影响程序运行/程序终止，需要被编码者关注
#define ERROR   3         // 错误：有错误！这个错误不影响后续程序，可能是功能执行完成了，但是是失败的，或者因为条件不满足而没执行功能！
#define FATAL   4         // 代码出现致命错误！程序无法继续执行/运行！

const char* gLevelMap[] = {
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"
};

#define LOGFILE "./Log.log"

/**
 * 参数一：日志级别
 * 参数二：输出的日志信息（级别相对应的提示码与信息）[可变参数]
*/
void logMessage(int level,  /* const std::string &info,*/ const char *format, ... )
{


    // va_list ap;                 // 实际是 char 类型的指针
    // va_start(ap, format);       // 让指针指向可变参数列表
    // int x = va_arg(ap, int);    // 从ap空间获取指定类型内容
    
    // va_end(ap);                   // 等价于 ap = NULL;
#ifndef DEBUG_SHOW
    if(level== DEBUG) return;
#endif

    char stdBuffer[1024];           // 标准部分
    char logBuffer[1024];           // 自定义部分

    time_t timestamp = time(nullptr);
    // struct tm *localtime = localtime(&timestamp);
    // 日志等级 + 时间戳
    snprintf(stdBuffer, sizeof stdBuffer, "[%-10s] [%ld] ", gLevelMap[level], timestamp);

    va_list args;
    va_start(args, format);
    //vprintf(format, args);
    vsnprintf(logBuffer, sizeof(logBuffer), format, args);
    va_end(args);

    FILE *fp = fopen(LOGFILE, "a");
    // printf("%s%s\n", stdBuffer, logBuffer);
    fprintf(fp, "%s%s\n", stdBuffer, logBuffer);
    fclose(fp);
}

#endif